package entity.util;

import java.util.Date;

import entity.Atividade;
import entity.Fase;
import entity.Fase.FaseRUP;
import entity.Iteracao;
import entity.Periodo;
import entity.Projeto;
import entity.Recurso;

public class MockUtil {
	private MockUtil() {}
	
	public static Iteracao iteracaoPlanejada(Iteracao iteracao) {
		iteracao.planejar();
		Recurso recurso = new Recurso() {
			private static final long serialVersionUID = 1L;

			@Override
			public Integer getIdRecurso() {
				return 1;
			}
		};
		iteracao.getFase().getProjeto().adicionarRecurso(recurso);
		iteracao.adicionarRecurso(recurso);
		iteracao.criarAtividade().setResponsavel(recurso);
		iteracao.concluirPlanejamento();
		
		return iteracao;
	}
	
	public static Iteracao iteracaoConcluida(Iteracao iteracao) {
		iteracaoPlanejada(iteracao);
		iteracao.iniciar(iteracao.getInicio());
		iteracao.concluir(new Date());
		
		return iteracao;
	}
	
	public static Projeto projetoEmPlanejamento(String nome, Date ini, Date fim) {
		Projeto p = new Projeto(nome, new Periodo(ini, fim));
		p.planejar();
		return p;
	}
	
	public static Iteracao iteracaoDe10Dias() {
		return new Iteracao("bla", 10);
	}
	
	public static Iteracao iteracaoDe11Dias() {
		return new Iteracao("bla", 11);
	}

	public static Iteracao iteracaoDe9Dias() {
		return new Iteracao("bla", 9);
	}
	
	public static Iteracao iteracaoDe100HorasEstimadas() {
		return new Iteracao("iteracao de 100 horas", 10) {
			@Override
			public Integer getHorasEstimadas() {
				return 100;
			}
		};
	}
	
	public static Iteracao iteracaoDe100HorasRealizadas() {
		return new Iteracao("iteracao de 100 horas", 10) {
			@Override
			public Integer getHorasRealizadas() {
				return 100;
			}
		};
	}
	
	public static Recurso recurso() {
		return new Recurso() {
			private static final long serialVersionUID = 6718753767663403105L;

			@Override
			public Integer getIdRecurso() {
				return (int) Math.random() * 1000 ;
			}
		};
	}
	
	private static void removeFasesSemIteracao(Projeto projeto) {
		for (Fase fase : projeto.getFases()) {
			if (!fase.possuiIteracao()) {
				projeto.removerFase(fase.getFaseRup());
			}
		}
	}
	
	public static Iteracao iteracaoEmPlanejamento(Date inicio, Date fim) {
		Projeto projeto = projetoEmPlanejamento("X", inicio, fim);
		projeto.adicionarIteracao(FaseRUP.INICIACAO, iteracaoDe10Dias());
		removeFasesSemIteracao(projeto);
		Iteracao iteracao = projeto.getIteracao(FaseRUP.INICIACAO, 1);
		projeto.finalizarPlanejamento();
		iteracao.planejar();
		
		return iteracao;
	}
	
	public static Atividade atividadeIteracaoPlanejada(Date inicio, Date fim) {
		Atividade atividade = atividadeIteracaoEmPlanejamento(inicio, fim);
		atividade.getIteracao().concluirPlanejamento();
		
		return atividade;
	}
	
	public static Atividade atividadeIteracaoEmPlanejamento(Date inicio, Date fim) {
		Iteracao iteracao = iteracaoEmPlanejamento(inicio, fim);
		Recurso recurso = recurso();
		iteracao.getFase().getProjeto().adicionarRecurso(recurso);
		iteracao.adicionarRecurso(recurso);
		Atividade atividade = iteracao.criarAtividade();
		atividade.setResponsavel(recurso());
		atividade.setPeriodo(new Periodo(inicio, fim));
		
		return atividade;
	}

}
